*--------------------------------------------------------------; * Selects a set of ns repeated systematic samples from a ; * finite population stored in a SAS data set called frame ; *--------------------------------------------------------------; %macro repsys(noprint,frame=,npop=,ns=,kprime=,rep=,sample=,setup=, seed=); %if %length(&seed) = 0 %then %let seed = %str(0); %if %length(&frame) = 0 %then %let frame = %str(frame); %if %length(&npop) = 0 %then %let npop = %str(npop); %if %length(&ns) = 0 %then %let ns = %str(ns); %if %length(&kprime) = 0 %then %let kprime = %str(kprime); %if %length(&rep) = 0 %then %let rep = %str(rep); %if %length(&sample) = 0 %then %let sample = %str(sample); data temp_; set &frame; id + 1; data idnos_; %if %length(&setup) > 0 %then %do; set &setup; %end; retain nprime_ 0 pprime_ 1 rprime_ 0 u_ 0; ns_ = &ns; kprime_ = &kprime; npop_ = &npop; nprime_ = kprime_; rprime_ = kprime_ - ns_; u_ = ranuni(&seed); pprime_ = pprime_*rprime_/nprime_; do id = 1 to kprime_; if pprime_ > u_ then rprime_ = rprime_ - 1; else do; output; pprime_ = 1; u_ = ranuni(&seed); end; nprime_ = nprime_ - 1; if nprime_ > 0 then pprime_ = pprime_*rprime_/nprime_; end; call symput('kprime',trim(left(kprime_))); call symput('ns',trim(left(ns_))); call symput('npop',trim(left(npop_))); keep id; proc print data = idnos_; title "Starting Points for &ns Systematic Samples"; data temp2_; set idnos_; by id; if first.id then do; u_ = id; rep + 1; output; end; rept_: u_ = u_ + &kprime; if u_ > &npop then return; id = u_; output; go to rept_; proc sort data = temp2_; by id; data &sample; merge temp_ temp2_(in=insamp); if insamp = 1; drop u_; proc sort data = &sample; by rep; %if %length(&noprint) = 0 %then %do; proc print data = &sample split='*'; title1 "Repeated Systematic Sample"; title2 "ns = &ns k' = &kprime"; title3 "Output dataset = &sample"; %end; run; title; %mend repsys;